package main

import (
	"fmt"
	"net/http"
	"os"
)

func main() {

	spendOneday()

	//defer通常用于延迟调用指定的函数
	/*defer语句经常被用于处理成对的操作，如打开和关闭，连接和断开连接，加锁和释放锁。
	恰当使用defer能够保证资源正确释放。


	*/
	outerFunc()

}

func outerFunc() {
	defer fmt.Printf(" World! \n")
	fmt.Println("Hello")
	//defer会在outerFunc退出之前执行打印操作，因此被defer调用的函数也称为“延迟函数”
}

// 使用defer关闭http请求响应体的Body
func closeBody(url string) error {
	resp, err := http.Get(url)
	defer resp.Body.Close()
	//... do more stuff ...
	return err
}

// 使用defer关闭文件句柄
func closeFile(fileName string) error {
	f, err := os.Open(fileName)
	defer f.Close()
	//... do more stuff ...
	return err
}

// 使用defer解锁
func billCustomer(c *Customer) {

}

func spendOneday() {
	fmt.Println("现在是白天，我准备将花带到门口晒太阳")

	//类似于告诉助手，在函数结束之前，由系统帮忙执行该条语句
	defer fmt.Println("一天结束了，我要将花拿回屋里了")

	fmt.Println("做一些其它的事情...")

	//多个defer出现时，如何执行？ （后进先出原则）
}
